#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include"struct.h"
#include<QImage>
using namespace std;


class Image
{
public:
    //构造函数及其重载
    Image() {}//创建行列都为零的Image对象
    Image(int h, int w);//创建h行，w列的Image对象
    Image(int h, int w, unsigned char val); //创建的图像像素值都为val;
    Image(const char* ImageName); //利用文件名从硬盘加载图像文件成为Image对象;
    Image(Image& im); //拷贝构造函数;
    ~Image(); //析构函数;
    unsigned char& At(int row, int col,unsigned char &r,unsigned char &g, unsigned char &b); //获取第row行第col列的像素点的值;
    void Set(unsigned char value); //设置图像所有像素为同一值;
    void Flip(int code); //图像的翻转; 根据code的值：0:左右翻转，1:上下翻转;
    void Resize(int code); //图像的缩放;根据code的值：0:缩小一倍，1:放大一倍;
    void Cut(int x1, int y1, int x2, int y2);//裁剪点(x1,y1)到点(x2,y2)的图像
    void Rotate(int degree);//图像旋转的函数（简单起见，旋转角度为90度的整）
    void Mean_Variance(float& m, float& var);//求图像的均值和方差，利用参数输出
    void myFree(unsigned char**** d, int h, int w);
    void alloc(unsigned char**** d, int h, int w);
    void WriteBMP(const char*filename);
    void ReadBMP(const char *filename);
    void rotate();
    int Height()
    {
        return height;
    }
    int Width()
    {
        return width;
    }
    //描边
    operator QImage()
        {
           QImage *image=new QImage (width, height,QImage::Format_RGB888 );
           for(int i=0;i<width;i++)
           {
               for(int j=0;j<height;j++)
               {
                image->setPixel(i,height-j-1,qRgb(data[j][i][2],data[j][i][1],data[j][i][0]));
               }
           }
            return *image;
        }
    void gray();
    void Jpint(Image &a, int code);//1上下，2左右
    void bianyuan();
    void suan(unsigned char ***t);
    int qbount(int a,int b,int c);

private:
    int height;
    int width;
    unsigned char*** data;
    BMPFILEHEADER bmpfileheader;
    BITMAPINFOHEADER bitmapinfoheader;
};

